#include "algorithm.h"
#include "string.h"


//__asm void nop(void)
//{
//    NOP;

//}

//void NOP_dly(u32 cnt)
//{
//	while(cnt-- > 0)
//	{
//		nop();
//	}
//}

u8 asc2hex(u8 ascDa)
{
	u8 reDa = 0x00;

	if ( (ascDa >= 'A') && (ascDa <= 'F') )
	{
		reDa = ascDa - 'A' + 10;
	}
	else if ( (ascDa >= 'a') && (ascDa <= 'f') )
	{
		reDa = ascDa - 'a' + 10;
	}
	else if ( (ascDa >= '0') && (ascDa <= '9') )
	{
		reDa = ascDa - '0';
	}

	return reDa;
}

void ASCII2BCD(u8 * ascii, u8 * bcd, u8 ascLen)
{
	u8 i,j;
	u8 len;

	len = ascLen / 2;

	j = 0;
	for (i=0;i<len;i++)
	{
		bcd[i] = asc2hex(ascii[j++]);
		bcd[i] <<= 4;
		bcd[i] &= 0xf0;
		bcd[i] |= asc2hex(ascii[j++]);
	}
}

/*
十进制的ascii数字转换成u32
*/
u32 ASCII2Hex(u8 * ascii, u8 ascLen)
{
	u8 i;
	u32 tmp;

	tmp = 0;
	for (i=0;i<ascLen;i++)
	{
		tmp = asc2hex(ascii[i]) + tmp * 10;
	}
	
	return tmp;
}



///*
//只处理低4位
//*/
//u8 OneBCD2ASC(u8 bcd)
//{
//	u8 reDa;
//
//	bcd %= 0x10;
//
//	if ( bcd > 9 )
//	{
//		reDa = bcd - 10 + 'A';
//	}
//	else
//	{
//		reDa = bcd + '0';
//	}
//
//	return reDa;
//}

void BCD2ASCII(u8 * bcd, u8 * ascii, u8 bcdLen)
{
	u8 i,j;

	j = 0;
	for (i=0;i<bcdLen;i++)
	{
		ascii[j++] = hexNum2ASC(bcd[i] >> 4);
		ascii[j++] = hexNum2ASC(bcd[i]&0x0f);
	}
}


void delay(u32 dlyCnt)
{
	while (dlyCnt > 0)
	{
		dlyCnt --;
	}
}


/*
把两个char的u8，合成一个u16
*/
u16 char2u16(u8 * da)
{
	return (u16)((0xff00)&(da[0] << 8)) | (da[1]&0x00ff);
}


u8 get_chk_xor(u8 * da, u16 len)
{
	u8 xorr;
	u16 i;
	xorr = 0;
	for (i=0;i<len;i++)
	{
		xorr ^= da[i];
	}

	return xorr;
}

/*
累加和
*/
u8 get_chk_sum(u8 * da, u16 len)
{
	u8 sumDa;
	u16 i;
	sumDa = 0;
	for (i = 0; i < len; i++)
	{
		sumDa += da[i];
	}

	return sumDa;
}

u8 Hex2BCD(u8 da)
{
	return (da)/10*0x10 + (da)%10;
}

u8 BCD2Hex(u8 da)
{
	return (da)/0x10*10 + (da)%0x10;
}

u8 hexNum2ASC(u8 da)
{
	u8 reDa;
	da &= 0x0f;

	if (da <= 9)
	{
		reDa = da + '0';
	}
	else
	{
		reDa = da + 'A' - 10;
	}
	return reDa;
}

/*
返回小写的ascii
*/
u8 hexNum2asc(u8 da)
{
	u8 reDa;
	da &= 0x0f;

	if (da <= 9)
	{
		reDa = da + '0';
	}
	else
	{
		reDa = da + 'a' - 10;
	}
	return reDa;
}

//================================================================================
// 函数名称：Int_To_AscII(u16 )
// 功能描述：
// 参数描述：无
//================================================================================
void Int_To_ASCII_p(u32 dat,char *buf, u8 * bufLen)
{
	u8 len;

	if(dat >= 10000)
	{
		buf[0] = dat /10000 + 0x30;
		dat %= 10000;
		buf[1] = dat /1000 + 0x30;
		dat %= 1000;
		buf[2] = dat / 100 + 0x30;
		dat %= 100;
		buf[3] = dat / 10 + 0x30;
		dat %= 10;
		buf[4] = dat + 0x30;
		len = 5;
	}
	else if(dat >= 1000)
	{
		buf[0] = dat /1000 + 0x30;
		dat %= 1000;
		buf[1] = dat /100 + 0x30;
		dat %= 100;
		buf[2] = dat / 10 + 0x30;
		dat %= 10;
		buf[3] = dat + 0x30;
		len = 4;
	}
	else if(dat >= 100)
	{
		buf[0] = dat /100 + 0x30;
		dat %= 100;
		buf[1] = dat /10 + 0x30;
		dat %= 10;
		buf[2] = dat + 0x30;
		len = 3;
	}
	else if(dat >= 10)
	{
		buf[0] = dat /10 + 0x30;
		dat %= 10;
		buf[1] = dat + 0x30;
		len = 2;
	}
	else
	{
		buf[0] = dat + 0x30;
		len = 1;
	}

	*bufLen = len;
}


void Int_To_ASCII(u16 dat,char *buf)
{	
	u8 reDa;

	Int_To_ASCII_p(dat, buf, &reDa);

}

/*
把IP中空格去掉
*/
void delIpBlank(u8 * ip, u8 * pLen)
{
	u8 i;
	u8 j;
	u16 ipNum[4];
	u8 len;
	
	len = *pLen;

	if (len>15)
	{
		return;			//err
	}
	
	j=0;
	ipNum[0] = 0;
	ipNum[1] = 0;
	ipNum[2] = 0;
	ipNum[3] = 0;

	for (i=0;i<len;i++)
	{
		if ( (ip[i]>='0') && (ip[i]<='9') )
		{
			ipNum[j] = ipNum[j] * 10 + (ip[i] - '0');

			if (ipNum[j] > 255)
			{
				return;	//err
			}
		}
		else if (ip[i] == '.')
		{
			j ++;
		}
		else
		{
			return;	//err
		}

		if (j>= 4)
		{
			return;	//err
		}
	}
	
	i=0;
	u32_To_ASCII_p2(ipNum[0], (char *)(&ip[i]), &j);
	i += j;
	ip[i++] = '.';
	u32_To_ASCII_p2(ipNum[1], (char *)(&ip[i]), &j);
	i += j;
	ip[i++] = '.';
	u32_To_ASCII_p2(ipNum[2], (char *)(&ip[i]), &j);
	i += j;
	ip[i++] = '.';
	u32_To_ASCII_p2(ipNum[3], (char *)(&ip[i]), &j);
	
	*pLen = i+j;
	

	//return 0;
	
	
	
//	u8 i,j;
//	u8 * pIP;

//	j=0;
//	for (i=0;i<4;i++)
//	{
//		pIP = &ip[i*4];
//		if ( (pIP[0] == '0') && (pIP[1] == '0') )
//		{
//			memcpy(&ip[j], &pIP[2], 1);
//			j += 1;
//		}
//		else if ((pIP[0] == '0') && (pIP[1] != '0'))
//		{
//			memcpy(&ip[j], &pIP[1], 2);
//			j += 2;
//		}
//		else
//		{
//			
//			memcpy(&ip[j], &pIP[0], 3);
//			j += 3;
//		}

//		if ( i!= 3 )
//		{
//			ip[j] = '.';
//			j++;
//		}		
//	}

//	*pLen = j;


	

}

/*
把port中空格去掉
*/
void delPortBlank(u8 * str, u8 * pLen)
{
	u8 i;
	u8 len = *pLen;
	
	if (len>0)
	{
		len --;
	}

	for (i=0;i<len;i++)
	{
		if (str[i] != '0')
		{
			break;
		}
	}

	memcpy(str, &str[i],len-i+1);
	
	*pLen = len-i+1;

}



void NumIncOne(u8 * da)
{
	u8 Num;
	Num = *da;

	if ( ( Num >= '0') && ( Num<= '9') )
	{
		Num += 1;
		if (Num > '9')
		{
			Num = '0';
		}
	}
	*da = Num;
}

u32 hex4CombineOne(u8 * da)
{
	u32 reDa;
	reDa = da[0] << 24 |
		da[1] << 16 |
		da[2] << 8 |
		da[3];

	return reDa;
}

u16 hex2CombineOne(u8 * da)
{
	return char2u16(da);
}


void u32toHex4(u32 lDa, u8 * pDa)
{
	pDa[0] = (u8)(lDa>>24);
	pDa[1] = (u8)(lDa>>16);
	pDa[2] = (u8)(lDa>>8);
	pDa[3] = (u8)(lDa);
	
}

void u16toHex2(u16 lDa, u8 * pDa)
{
	pDa[0] = (u8)(lDa>>8);
	pDa[1] = (u8)(lDa);
	
}


u16 chkSumU16(u8 * da, u16 len)
{
	u16 i;
	u16 reDa;

	reDa = 0;
	for (i=0;i<len;i++)
	{
		reDa += da[i];
	}

	return reDa;

}



/*
是IP格式返回0
不是返回1
*/
u8 judgeIpType(u8 * Ip, u8 len)
{
	u8 i;
	u8 j;
	u16 ipNum[4];

	if (len>15)
	{
		return 1;			
	}
	
	j=0;
	ipNum[0] = 0;
	ipNum[1] = 0;
	ipNum[2] = 0;
	ipNum[3] = 0;

	for (i=0;i<len;i++)
	{
		if ( (Ip[i]>='0') && (Ip[i]<='9') )
		{
			ipNum[j] = ipNum[j] * 10 + (Ip[i] - '0');

			if (ipNum[j] > 255)
			{
				return 1;
			}
		}
		else if (Ip[i] == '.')
		{
			j ++;
		}
		else
		{
			return 1;
		}

		if (j>= 4)
		{
			return 1;
		}
	}

	return 0;
}


/*
检验是否合法
特殊格式的，如果都是FF，合法
如果符合YYYYMMDD
非法返回0
合法返回1
*/
u8 chk_YYYYMMDD_BCD_SP(u8 * pDa)
{
	u8 i;
	u8 month;
	u8 day;

	for (i = 0; i < 4;i++)
	{
		if (pDa[i] != 0xff)
		{
			break;
		}
	}

	if (i>=4)
	{
		return 1;
	}

	//year
	if (((pDa[0] & 0x0f) > 9) ||
		(((pDa[0] >> 4) & 0x0f) > 9))
	{
		return 0;
	}

	//year
	if (((pDa[1] & 0x0f) > 9) ||
		(((pDa[1] >> 4) & 0x0f) > 9))
	{
		return 0;
	}


	//month
	if (((pDa[2] & 0x0f) > 9) ||
		(((pDa[2] >> 4) & 0x0f) > 1))
	{
		return 0;
	}

	//day
	if (((pDa[3] & 0x0f) > 9) ||
		(((pDa[3] >> 4) & 0x0f) > 3))
	{
		return 0;
	}

	month = BCD2Hex(pDa[2]);
	day = BCD2Hex(pDa[3]);

	if (month > 12)
	{
		return 0;
	}

	if ((month == 1) ||
		(month == 3) ||
		(month == 5) ||
		(month == 7) ||
		(month == 8) ||
		(month == 10) ||
		(month == 12))
	{
		if (day > 31)
		{
			return 0;
		}
	}
	else if (month == 2)
	{
		if (day > 29)
		{
			return 0;
		}
	}
	else
	{
		if (day > 30)
		{
			return 0;
		}
	}

	if (day == 0)
	{
		return 0;
	}

	if (month == 0)
	{
		return 0;
	}

	return 1;

}


/*
BCD  YY MMDD HHMMSS
非法返回0
合法返回1
*/
u8 chk_valid_bcd_time(u8 * da)
{
	u8 year;
	u8 month;
	u8 day;
	u8 hexDa;
	

	//year
	if ( ( (da[0] & 0x0f) > 9 ) ||
		( ((da[0]>>4) & 0x0f) > 9 ) )
	{
		return 0;
	}
	year = BCD2Hex(da[0]);

	//2014年已经永远的成为过去了
	if (year < 15)
	{
		return 0;
	}

	//month
	if ( ( (da[1] & 0x0f) > 9 ) ||
		( ((da[1]>>4) & 0x0f) > 1 ) )
	{
		return 0;
	}

	//day
	if ( ( (da[2] & 0x0f) > 9 ) ||
		( ((da[2]>>4) & 0x0f) > 3 ) )
	{
		return 0;
	}
	
	
	month = BCD2Hex(da[1]);
	day = BCD2Hex(da[2]);
	
	if (month > 12)
	{
		return 0;
	}
	
	if ( (month == 1) ||
		(month == 3) ||
		(month == 5) ||
		(month == 7) ||
		(month == 8) ||
		(month == 10)||
		(month == 12) )
	{
		if (day > 31)
		{
			return 0;
		}
	}
	else if (month == 2)
	{
		if (day > 29)
		{
			return 0;
		}
	}
	else
	{
		if (day > 30)
		{
			return 0;
		}
	}
	
	if (day == 0)
	{
		return 0;
	}
	
	if (month == 0)
	{
		return 0;
	}
		
	
	//hour
	hexDa = BCD2Hex(da[3]);
	if (hexDa > 24)
	{
		return 0;
	}
	if ( ( (da[3] & 0x0f) > 9 ) ||
		( ((da[3]>>4) & 0x0f) > 2 ) )
	{
		return 0;
	}

	//min
	hexDa = BCD2Hex(da[4]);
	if (hexDa > 60)
	{
		return 0;
	}
	if ( ( (da[4] & 0x0f) > 9 ) ||
		( ((da[4]>>4) & 0x0f) > 5 ) )
	{
		return 0;
	}

	//sec
	
	hexDa = BCD2Hex(da[5]);
	if (hexDa > 60)
	{
		return 0;
	}
	if ( ( (da[5] & 0x0f) > 9 ) ||
		( ((da[5]>>4) & 0x0f) > 5 ) )
	{
		return 0;
	}

	return 1;
}


/*
BCD NUM 
0 ~9
非法返回0
合法返回1
*/
u8 chk_valid_bcd_num(u8 * da, u8 len)
{
	u8 i;
	for (i=0;i<len;i++)
	{
		if ( ( (da[i] & 0x0f) > 9 ) ||
			( ((da[i]>>4) & 0x0f) > 9 ) )
		{
			return 0;
		}
	}

	return 1;
}

/*
ASC NUM 
0 ~9
非法返回0
合法返回1
*/
u8 chk_valid_ASC_num(u8 * da, u8 len)
{
	u8 i;
	for (i=0;i<len;i++)
	{
		if ( (da[i] > '9' ) ||
			( da[i] < '0' ) )
		{
			return 0;
		}
	}

	return 1;
}

/*
0 ~9 * #
非法返回0
合法返回1
*/
u8 chk_valid_ASC_num2(u8 * da, u8 len)
{
	u8 i;
	for (i = 0; i<len; i++)
	{
		if ((da[i] > '9') ||
			(da[i] < '0'))
		{
			if ((da[i] != '*') &&
				(da[i] != '#'))
			{
				return 0;
			}
		}
	}

	return 1;
}



/*
ASCII YYMM
非法返回0
合法返回1
比如输入1312合法
1314非法
*/
u8 chk_valid_ASC_YYMM(u8 * da)
{
	u8 i;
	for (i=0;i<4;i++)
	{
		if (da[i] < 0x30)
		{
			return 0;
		}
	}
	
	if ( (da[0] > 0x39) || (da[1] > 0x39) )
	{
		return 0;
	}
	if ( (da[2] > 0x31) || (da[3] > 0x39) )
	{
		return 0;
	}

	
	return 1;
}

/*转换成月*/
u16 ASC_YYMM_toHex(u8 * da)
{
	u16 reDa;

	reDa = (da[0] - 0x30) * 10 * 12 +
		(da[1] - 0x30) * 12 +
		(da[2] - 0x30) * 10 +
		(da[3] - 0x30);

	return reDa;

}


uint64_t getU64_dif(uint64_t a, uint64_t b)
{
	if (a>b)
	{
		return (a-b);
	}
	else
	{
		return(b-a);
	}
}

u32 getU32_dif(u32 a, u32 b)
{
	if (a>b)
	{
		return (a-b);
	}
	else
	{
		return(b-a);
	}
}
/*
转大写
*/
void hexStr2ASCII(u8 * pHexStr, u8 * pAscii, u16 hexLen)
{
	u16 i;
	u32 j;

	j = 0;
	for (i=0;i<hexLen;i++)
	{
		pAscii[j++] = hexNum2ASC(pHexStr[i]>>4);
		pAscii[j++] = hexNum2ASC(pHexStr[i]);
	}
}

/*
转小写
*/
void hexStr2ascii(u8 * pHexStr, u8 * pAscii, u16 hexLen)
{
	u16 i;
	u32 j;

	j = 0;
	for (i=0;i<hexLen;i++)
	{
		pAscii[j++] = hexNum2asc(pHexStr[i]>>4);
		pAscii[j++] = hexNum2asc(pHexStr[i]);
	}
}
void hexstr2asciidd(u8 * pHexStr, u8 * pAscii, u16 hexLen)
{
	u16 i;
	u32 j;

	j = 0;
	for (i=0;i<hexLen;i++)
	{
		if((pHexStr[i] >= '0') && (pHexStr[i] <= '9'))
		{
			pAscii[j++] = pHexStr[i]-'0';	
		}
		else if((pHexStr[i] >= 'a') && (pHexStr[i] <= 'z'))
		{
			pAscii[j++] = pHexStr[i]-0x37;	
		}
		else if((pHexStr[i] >= 'A') && (pHexStr[i] <= 'Z'))
		{
			pAscii[j++] = pHexStr[i]-0x57;
		}
	}
}
void u16_To_ASCII_hex(u32 dat,char *buf, u8 * bufLen)
{
	u8 i;
	i = 0;
	buf[i++] = hexNum2ASC(dat>>12);
	buf[i++] = hexNum2ASC(dat>>8);
	buf[i++] = hexNum2ASC(dat>>4);
	buf[i++] = hexNum2ASC(dat);

	*bufLen = i;
}


void u32_To_ASCII_hex(u32 dat,char *buf, u8 * bufLen)
{
	u8 i;
	i = 0;
	buf[i++] = hexNum2ASC(dat>>28);
	buf[i++] = hexNum2ASC(dat>>24);
	buf[i++] = hexNum2ASC(dat>>20);
	buf[i++] = hexNum2ASC(dat>>16);
	buf[i++] = hexNum2ASC(dat>>12);
	buf[i++] = hexNum2ASC(dat>>8);
	buf[i++] = hexNum2ASC(dat>>4);
	buf[i++] = hexNum2ASC(dat);
	
	*bufLen = i;
}

//================================================================================
// 函数名称：Int_To_AscII(u16 )
// 功能描述：
// 参数描述：无
//================================================================================
void u32_To_ASCII_p2(u32 dat,char *buf, u8 * bufLen)
{
	u8 len;
	
	len = 0;
	
	if(dat >= 100000000)
	{
		buf[0] = dat /100000000 + 0x30;
		dat %= 100000000;
		buf[1] = dat /10000000 + 0x30;
		dat %= 10000000;
		buf[2] = dat / 1000000 + 0x30;
		dat %= 1000000;
		buf[3] = dat / 100000 + 0x30;
		dat %= 100000;
		buf[4] = dat / 10000 + 0x30;
		dat %= 10000;
		buf[5] = dat / 1000 + 0x30;
		dat %= 1000;
		buf[6] = dat / 100 + 0x30;
		dat %= 100;
		buf[7] = dat / 10 + 0x30;
		dat %= 10;
		buf[8] = dat + 0x30;
		len = 9;
	}
	else if(dat >= 10000000)
	{
		buf[0] = dat /10000000 + 0x30;
		dat %= 10000000;
		buf[1] = dat /1000000 + 0x30;
		dat %= 1000000;
		buf[2] = dat / 100000 + 0x30;
		dat %= 100000;
		buf[3] = dat / 10000 + 0x30;
		dat %= 10000;
		buf[4] = dat / 1000 + 0x30;
		dat %= 1000;
		buf[5] = dat / 100 + 0x30;
		dat %= 100;
		buf[6] = dat / 10 + 0x30;
		dat %= 10;
		buf[7] = dat + 0x30;
		len = 8;
	}
	else if(dat >= 1000000)
	{
		buf[0] = dat /1000000 + 0x30;
		dat %= 1000000;
		buf[1] = dat /100000 + 0x30;
		dat %= 100000;
		buf[2] = dat / 10000 + 0x30;
		dat %= 10000;
		buf[3] = dat / 1000 + 0x30;
		dat %= 1000;
		buf[4] = dat / 100 + 0x30;
		dat %= 100;
		buf[5] = dat / 10 + 0x30;
		dat %= 10;
		buf[6] = dat + 0x30;
		len = 7;
	}
	else if(dat >= 100000)
	{
		buf[0] = dat /100000 + 0x30;
		dat %= 100000;
		buf[1] = dat /10000 + 0x30;
		dat %= 10000;
		buf[2] = dat / 1000 + 0x30;
		dat %= 1000;
		buf[3] = dat / 100 + 0x30;
		dat %= 100;
		buf[4] = dat / 10 + 0x30;
		dat %= 10;
		buf[5] = dat + 0x30;
		len = 6;
	}
	else if(dat >= 10000)
	{
		buf[0] = dat /10000 + 0x30;
		dat %= 10000;
		buf[1] = dat /1000 + 0x30;
		dat %= 1000;
		buf[2] = dat / 100 + 0x30;
		dat %= 100;
		buf[3] = dat / 10 + 0x30;
		dat %= 10;
		buf[4] = dat + 0x30;
		len = 5;
	}
	else if(dat >= 1000)
	{
		buf[0] = dat /1000 + 0x30;
		dat %= 1000;
		buf[1] = dat /100 + 0x30;
		dat %= 100;
		buf[2] = dat / 10 + 0x30;
		dat %= 10;
		buf[3] = dat + 0x30;
		len = 4;
	}
	else if(dat >= 100)
	{
		buf[0] = dat /100 + 0x30;
		dat %= 100;
		buf[1] = dat /10 + 0x30;
		dat %= 10;
		buf[2] = dat + 0x30;
		len = 3;
	}
	else if(dat >= 10)
	{
		buf[0] = dat /10 + 0x30;
		dat %= 10;
		buf[1] = dat + 0x30;
		len = 2;
	}
	else
	{
		buf[0] = dat + 0x30;
		len = 1;
	}

	*bufLen = len;
}


/*
为了显示把Ip扩展成3位
*/
void IP_Format(u8 * IpDst, u8 * IpSrc, u8 Len)
{
	u8 i,j,k;

	memcpy(IpDst, "000.000.000.000", 15);

	for (i=Len-1,j=0,k=4;;i--)
	{
		if (IpSrc[i] != '.')
		{
			IpDst[4*k-2-j] = IpSrc[i];
			j++;
		}
		else
		{
			k--;
			j = 0;
		}
		
		if (i==0) break;
	}
}

/*
为了菜单中显示端口号
*/
void Port_Format(u8 * PortDst, u8 * PortSrc, u8 Len)
{
	u8 i;


	for (i=0;i<5;i++)
	{
		if (i<Len)
		{
			PortDst[4-i] = PortSrc[Len - i - 1];
		}
		else
		{
			PortDst[4-i] = '0';
		}
	}
}

/*
判断身份证日期合法性
*/
void get_id_valid_time(u8 * pRawData, u8* pDate)
{
	u8 i, j;
	u8 tmpASCDate[8];
	
	
	
	for (i = 0, j = 0; i < 16; i++)
	{
		if (((pRawData[i] >= '0') &&
			(pRawData[i] <= '9')) ||
			(pRawData[i] == 0x20))		//blank
		{
			tmpASCDate[j++] = pRawData[i];
			if (j >= 8)
			{
				break;
			}
		}

	}


	if (j >= 4)
	{
		ASCII2BCD(tmpASCDate, pDate, 8);
	}
	else
	{
		memcpy(pDate, "\x99\x99\x01\x01", 8);
	}
}



/*
返回1，教练卡过期
返回0，没过期
*/
u8 Card_YYMM_NotValid(u8 * pDate, u16 year, u8 month)
{
	if (chk_valid_ASC_YYMM(pDate) == 0)
	{
		return 1;
	}

	//过期
	if (ASC_YYMM_toHex(pDate) < (year*12 + month))
	{
		return 1;
	}

	return 0;
}



/*
把ASCII格式数据，转换成hex格式
*/
void DecASCII2HexWORD(u8 * pASC, u8 AscLen, u16 * pReDa)
{
	u8 i;
	u16 ReHex;
	
	if (AscLen > 5) return;
	
	ReHex = 0;
	*pReDa = 0;
	
	for(i=0;i<AscLen;i++)
	{
		if ( (pASC[i] < '0') || (pASC[i] > '9') )
		{
			break;
		}
		
		ReHex = ReHex * 10 + (pASC[i]- 0x30);
		
	}
	
	*pReDa = ReHex;
}

/*
把ASCII格式ver数据，转换成hex格式
*/
void ASCIIver2Hex(u8 * pASC, u8 AscLen, u8 * pReDa)
{
	u8 i=0,j=0,k=0;
	u8 pASCtp[100]={0};
	for(i=0;i<AscLen;i++)
	{
		if ( (pASC[i] != '.') )
		{
			pASCtp[j++] = pASC[i];
		}	
	}	
	for(i=0;i<j;i += 2)
	{
		pReDa[k++] = (asc2hex(pASCtp[i])<<4) | (asc2hex(pASCtp[i+1]));
	}
}

void ASCIImac2Hex(u8 * pASC, u8 AscLen, u8 * pReDa)
{
	u8 i=0,j=0,k=0;
	u8 pASCtp[100]={0};
	for(i=0;i<AscLen;i++)
	{
		if ( (pASC[i] != ':') )
		{
			pASCtp[j++] = pASC[i];
		}	
	}	
	for(i=0;i<j;i += 2)
	{
		pReDa[k++] = (asc2hex(pASCtp[i])<<4) | (asc2hex(pASCtp[i+1]));
	}
}
/*
把ASCII格式数据，转换成hex格式
*/
void DecASCII2HexDWORD(u8 * pASC, u8 AscLen, u32 * pReDa)
{
	u8 i;
	u32 ReHex;
	
	if (AscLen > 10) return;
	
	ReHex = 0;
	for(i=0;i<AscLen;i++)
	{
		if ( (pASC[i] < '0') || (pASC[i] > '9') )
		{
			break;
		}
		
		ReHex = ReHex * 10 + (pASC[i]- 0x30);
		
	}
	
	*pReDa = ReHex;
	
}



void strReverse(u8 *inDa, u8 * outDa, u16 len)
{
	u16 i;
	for (i = 0; i < len; i++)
	{
		outDa[i] = ~inDa[i];
	}

}

/*
检查是否都是0xff，如果是则返回0
不全是FF返回1
*/
u8 chk_all_ff(u8 * pda, u32 len)
{
	u32 i;
	for (i = 0; i < len;i++)
	{
		if (pda[i] != 0xff)
		{
			break;
		}
	}

	if (i>=len)
	{
		return 0;
	}

	return 1;
}

/*
把输入的字符串异或某个字节
*/
void xor_string(u8 * pDa, u8 xByte, u16 len)
{
	u16 i;

	for (i = 0; i < len;i++)
	{
		pDa[i] ^= xByte;
	}
}

/*
大写字母变小写，仅26个英语字母
*/
void Letter2Lower(u8 * pDa, u8 len)
{
	u8 i;
	for (i = 0; i < len;i++)
	{
		if ((pDa[i] >= 'A') && (pDa[i] <= 'Z'))
		{
			pDa[i] = pDa[i]+0x20;
		}
	}
}


/*
返回0：使用的iP
返回1，使用的域名
http://139.129.11.215/dlFile/99.11.2205.0004.270010_2018.C01
https://www.bing.com/az/hprichbg/rb/UmbriaCastelluccio_ZH-CN9645718473_1920x1080.jpg
*/
u8 judgeIpOrDNS(u8 * pDa, u8 len)
{
	u8 reDa;
	u8 idx;

	reDa = 0xFE;
	if (len > 10)
	{
		//先判断是否有http头
		if (memcmp(pDa, "http://", 7) == 0)
		{
			idx = 7;
		}
		else if (memcmp(pDa, "https://", 8) == 0)
		{
			idx = 8;
		}
		else
		{
			idx = 0;
		}

		
		if ((pDa[idx] >= '0') &&
			(pDa[idx] <= '9'))
		{
			reDa = 0;
		}
		else if ((pDa[idx] >= 'a') &&
			(pDa[idx] <= 'z'))
		{
			reDa = 1;
		}
		else if ((pDa[idx] >= 'A') &&
			(pDa[idx] <= 'Z'))
		{
			reDa = 1;
		}
		else
		{
			reDa = 0xFE;
		}
	}

	return reDa;
}



/*
http://139.129.11.215/dlFile/99.11.2205.0004.270010_2018.C01
http://139.129.11.215:8080/dlFile/99.11.2205.0004.270010_2018.C01
成功返回0
失败返回0xFE
*/
u8 getIpPortFromHttpIPAdr(u8 * pAdr, u8 AdrLen, u8 * reIp, u8 * reIpLen, u8 * rePort, u8 * rePortLen)
{
	
	u8 reDa = 0xFE;
	u8 idx;
	u8 dotCnt;
	u8 i;
	u8 ipLen, portLen;

	*rePortLen = 0;
	*reIpLen = 0;

	if (AdrLen > 10)
	{
		//先判断是否有http头
		if (memcmp(pAdr, "http://", 7) == 0)
		{
			idx = 7;
		}
		else if (memcmp(pAdr, "https://", 8) == 0)
		{
			idx = 8;
		}
		else
		{
			idx = 0;
		}

		//防止地址的前两个字母是'/'
		if (pAdr[idx] == '/')
		{
			idx++;
		}
		if (pAdr[idx] == '/')
		{
			idx++;
		}


		dotCnt = 0;
		i = 0;
		ipLen = 0;
		portLen = 0;

		//从idx开始找Ip，理论上第一个字母应该是数字
		while (idx < AdrLen)
		{
			if ((dotCnt <= 3) && (ipLen <= 15))
			{
				if ((pAdr[idx] >= '0') &&
					(pAdr[idx] <= '9'))
				{
					reIp[ipLen++] = pAdr[idx];
				}
				else if (pAdr[idx] == '.')
				{
					reIp[ipLen++] = pAdr[idx];

					dotCnt++;
				}
			}

			if (pAdr[idx] == '/')
			{
				break;
			}

			if (pAdr[idx] == ':')
			{
				//这代表IP已经获取完了，等待取端口
				idx++;
				for (i = 0; (i < 5 && idx < AdrLen); i++)
				{
					if ((pAdr[idx] >= '0') &&
						(pAdr[idx] <= '9'))
					{
						rePort[portLen++] = pAdr[idx];
					}
					else 
					{
						//收到非数字的，应该认为端口判断已经结束了
						break;
					}
					idx++;
				}

				break;
			}

			idx++;
		}

		//判断获取的IP地址是否符合格式
		if ((ipLen <= 15) && (portLen <= 5))
		{
			if (judgeIpType(reIp, ipLen) == 0)
			{
				*reIpLen = ipLen;
				*rePortLen = portLen;
				//if (portLen == 0)
				//{
				//	//如果服务器端口没有指定，则默认是80
				//	//这一步移到上层程序设置了
				//}
				reDa = 0;
			}
		}
	}

	return reDa;
}

/*
https://www.bing.com/az/hprichbg/rb/UmbriaCastelluccio_ZH-CN9645718473_1920x1080.jpg
成功返回0
失败返回0xFE
*/
u8 getIpPortFromHttpDNSAdr(u8 * pAdr, u8 AdrLen, u8 * reAdr, u8 * reAdrLen, u8 * rePort, u8 * rePortLen)
{
	u8 reDa = 0xFE;
	u8 idx;
	u8 i;
	u8 ipLen, portLen;

	*rePortLen = 0;
	*reAdrLen = 0;

	if (AdrLen > 10)
	{
		//先判断是否有http头
		if (memcmp(pAdr, "http://", 7) == 0)
		{
			idx = 7;
		}
		else if (memcmp(pAdr, "https://", 8) == 0)
		{
			idx = 8;
		}
		else
		{
			idx = 0;
		}

		//防止地址的前两个字母是'/'
		if (pAdr[idx] == '/')
		{
			idx++;
		}
		if (pAdr[idx] == '/')
		{
			idx++;
		}

		i = 0;
		ipLen = 0;
		portLen = 0;

		//从idx开始找域名，理论上遇到/算结束，但是有可能不带/
		while (idx < AdrLen)
		{
			if (pAdr[idx] == '/')
			{
				break;
			}
			else if (pAdr[idx] == ':')
			{
				//这代表IP已经获取完了，等待取端口
				idx++;
				for (i = 0; (i < 5 && idx < AdrLen); i++)
				{
					if ((pAdr[idx] >= '0') &&
						(pAdr[idx] <= '9'))
					{
						rePort[portLen++] = pAdr[idx];
					}
					else
					{
						//收到非数字的，应该认为端口判断已经结束了
						break;
					}
					idx++;
				}

				break;
			}
			
			reAdr[ipLen++] = pAdr[idx];

			idx++;
		}

		//判断获取的IP地址是否符合格式
		if ((ipLen > 2) && (portLen <= 5))
		{
				*reAdrLen = ipLen;
				*rePortLen = portLen;
				reDa = 0;
		}
	}


	return reDa;
}




//================================================================================
// 函数名称：Int_To_AscII(u16 )
// 功能描述：
// 参数描述：无
//================================================================================
void Int_To_ASCII_p2(u32 dat,char *buf, u8 * bufLen)
{
	u32 ulDa;
	u8 iMax, i;
	u8 len;
	
	
	ulDa = dat;
	iMax = 0;
	while(ulDa != 0)
	{
		iMax++;
		ulDa /= 10;
	}
	
	if (iMax == 0)		//只有个位数
	{
		buf[0] = (u8)dat + 0x30;
		len = 1;
	}
	else
	{
		len = iMax;
		
		for(i=0;i<iMax;i++)
		{
				buf[iMax - 1 - i] = dat % 10 + 0x30;
				dat /= 10;
		}	
	}
	
	*bufLen = len;
}

/*
ASC 字母或数字或下划线返回0
其它返回1
*/
uint8_t chk_valid_ASC_name(uint8_t * da, uint16_t len)
{
	uint16_t i;

	for (i = 0; i<len; i++)
	{
		if (!( ((da[i] <= '9') && (da[i] >= '0')) ||
			((da[i] <= 'z') && (da[i] >= 'a')) ||
			((da[i] <= 'Z') && (da[i] >= 'A')) ||
			(da[i] == '_') ))
		{
			return 1;
		}
	}

	return 0;
}

/*******************************************************************************
** 函数:	get_valid_domain_name
** 功能：	域名合法化判断
** 参数:
** 返回值：	1 false 0 true
* 说明： 只支持com,net,cn结尾的顶级域名
*******************************************************************************/
uint8_t get_valid_domain_name(char *str, uint8_t len)
{
    const char* s=str;
    int segsize=0,i,ix=len;
	int segcnt = 0;

    if (s[0]=='.' || s[ix-1]=='.' || ix>63) 
        return 1;

    for(i=0,segsize=0; i<ix; i++)
    {
        if (s[i]=='.')
        {
            if (segsize==0) //..com
                return 1;
			segcnt += segsize;
			segcnt ++;
            segsize=0;
        }
        else if ( ('0' <= s[i] && s[i] <='9') 
            || ('a' <= s[i] && s[i] <='z') 
            || ('A' <= s[i] && s[i] <='Z') 
            || (s[i]=='-' && segsize!=0 && i+1<ix && s[i+1]!='.')
            )
        {
            segsize++;
        }
        else
            return 1; 
 
        if (segsize>63)
            return 1;
    }
 
    if ((memcmp(s+segcnt,"com",strlen("com")) != 0)
		&& (memcmp(s+segcnt,"net",strlen("net")) != 0)
		&& (memcmp(s+segcnt,"cn",strlen("cn")) != 0))
        return 1;
 
    return 0;
}



